package json;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Timestamp;
import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import net.sf.rose.jdbc.PageBean;

import org.apache.log4j.Logger;
import org.springframework.ui.ModelMap;
import org.springframework.web.servlet.ModelAndView;

import flexjson.JSONSerializer;
import flexjson.transformer.DateTransformer;

public class JsonHttpResponse {

	public static String BODY_DATA_NAME = "data";
	private static Logger logger = Logger.getLogger(JsonHttpResponse.class);

	/**
	 * 利用flexjson将Map容器类型的数据转换成Json格式。
	 * 如果是BODY_DATA_NAME名称的数据是分页数据，则根据需要添加属性。
	 */
	public static void renderJson(HttpServletResponse response, Map<String, Object> map)  {
		Object data = map.get(BODY_DATA_NAME);
		// 如果是分页组件，则按照MiniUI的格式去完成
		if (data != null && data instanceof PageBean) {
			PageBean page = (PageBean) data;
			map.remove(BODY_DATA_NAME);
			map.put("total", page.getRecordCount());
			map.put(BODY_DATA_NAME, page.getRecords());
		}
		renderJson(response, (Object) map);
	}

	/**
	 * 利用flexjson将ModelAndView容器类型的数据转换成Json格式。
	 * 如果是BODY_DATA_NAME名称的数据是分页数据，则根据需要添加属性。
	 */
	public static void renderJson(HttpServletResponse response, ModelAndView mav) {
		ModelMap modelMap = mav.getModelMap();
		Object data = modelMap.get(BODY_DATA_NAME);
		// 如果是分页组件，则按照MiniUI的格式去完成
		if (data != null && data instanceof PageBean) {
			PageBean page = (PageBean) data;
			modelMap.remove(BODY_DATA_NAME);
			modelMap.addAttribute("total", page.getRecordCount());
			modelMap.addAttribute(BODY_DATA_NAME, page.getRecords());
		}
		renderJson(response, (Object) modelMap);
	}

	/**
	 * 利用flexjson将任何对像类型的数据转换成Json格式。
	 */
	public static void renderJson(HttpServletResponse response, Object data)  {
		JSONSerializer serializer = new JSONSerializer();
		serializer.transform(new DateTransformer("yyyy-MM-dd'T'HH:mm:ss"), Date.class);
		serializer.transform(new DateTransformer("yyyy-MM-dd'T'HH:mm:ss"), Timestamp.class);
		renderJson(response, serializer.deepSerialize(data));
	}

	/**
	 * 
	 */
	public static void renderJson(HttpServletResponse response, String text)  {
		/* 设置格式为text/json */
		response.setContentType("text/json");
		/* 设置字符集为'UTF-8' */
		response.setCharacterEncoding("UTF-8");
		PrintWriter out;
		try {
			out = response.getWriter();
			out.print(text);
			out.flush();
			logger.info(text);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 
	 */
	public static void renderMessage(HttpServletResponse response, String message)  {
		renderJson(response, "{\"message\":\"" + message + "\"}");
	}

}
